#include<bits/stdc++.h>
using namespace std;
#include<bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
const int G = 3,GINV = (MOD + 1)/3;
vector<int> trs[22];
vector<int> bg[22];
vector<int> bginv[22];
int qpow(int x,int p){
    int res = 1;
    while(p){
        if(p & 1){
            res = 1ll*x*res%MOD;
        }
        x = 1ll*x*x%MOD;
        p>>=1;
    }
    return res;
}

void init(){
    for(int i = 1;i <= 19;i++){
        trs[i] = vector<int>(1<<i);
        bg[i] = vector<int>(1<<i - 1);
        bginv[i] = vector<int>(1<<i - 1);
        for(int j = 0;j < i;j++){
            for(int k = 1<<j;k < (1<<j + 1);k++){
                trs[i][k] = trs[i][k - (1<<j)] | (1<<(i - j - 1));
            }
        }
        bg[i][0] = 1;
        bginv[i][0] = 1;
        int o1 = qpow(G,(MOD - 1)/(1<<i));
        int o2 = qpow(GINV,(MOD - 1)/(1<<i));
        for(int j = 1;j < (1<<i - 1);j++){
            bg[i][j] = 1ll*bg[i][j - 1]*o1%MOD;
            bginv[i][j] = 1ll*bginv[i][j - 1]*o2%MOD;
        }
    }
}

vector<int> FFT(const vector<int> &val,int tot,int lgt,vector<int> *base = bg){
    vector<int> res(tot);
    for(int j = 0;j < tot;j++){
        if(trs[lgt][j] < val.size()){
            res[j] = val[trs[lgt][j]];
        }
    }
    for(int i = 1;i<=lgt;i++){
        int len = 1<<i;
        int hlen = len/2;
        for(int j = 0;j < tot;j += len)
        {
            for(int k = j;k < j + hlen;k++){
                int va = res[k],vb = 1ll*base[i][k - j]*res[k + hlen]%MOD;
                res[k] = (va + vb)%MOD;
                res[k + hlen] = (va - vb + MOD)%MOD;
            }
        }
    }
    return res;
}

vector<int> IFFT(const vector<int> &val,int tot,int lgt){
    return FFT(val,tot,lgt,bginv);
}

vector<int> operator*(const vector<int> &va,const vector<int> &vb){
    int n = va.size() - 1;
    int m = vb.size() - 1;
    int tot = 1;
    int lgt = 0;
    while(tot <= n + m){
        tot<<=1;
        lgt++;
    }
    vector<int> FA = FFT(va,tot,lgt),FB = FFT(vb,tot,lgt);
    for(int i = 0;i < tot;i++){
        FA[i] = 1ll*FA[i]*FB[i]%MOD;
    }
    FA = IFFT(FA,tot,lgt);
    FA.resize(n + m + 1);
    int inv = qpow(tot,MOD - 2);
    for(int &v : FA){
        v = 1ll*v*inv%MOD;
    }
    return FA;
}
vector<int> operator+(const vector<int> &va,const vector<int> &vb){
    vector<int> res(va);
    if(vb.size() > va.size()){
        res.resize(vb.size());
    }
    for(int i = 0;i < vb.size();i++){
        res[i] = (res[i] + vb[i])%MOD;
    }
    return res;
}
vector<int> operator+(vector<int> va,int b){
    va[0] = (va[0] + b)%MOD;
    return va;
}
vector<int> operator-(vector<int> va,int b){
    va[0] = (va[0] - b + MOD)%MOD;
    return va;
}
vector<int> operator-(const vector<int> &va,const vector<int> &vb){
    vector<int> res(va);
    if(vb.size() > va.size()){
        res.resize(vb.size());
    }
    for(int i = 0;i < vb.size();i++){
        res[i] = (res[i] - vb[i] + MOD)%MOD;
    }
    return res;
}
vector<int> operator%(const vector<int> &va,int mod){
    vector<int> res(va);
    res.resize(mod);
    return res;
}
vector<int> inv(vector<int> &va,int mod){
    vector<int> res(1,qpow(va[0],MOD - 2));
    int smod = 1;
    while(smod < mod){
        smod*=2;
        int lgt = 0;
        int tot = 1;
        while(tot < smod*2){
            tot<<=1;
            lgt++;
        }
        vector<int> FA = FFT(res,tot,lgt),FB = FFT(va%smod,tot,lgt);
        for(int i = 0;i < tot;i++){
            FA[i] = (2ll*FA[i]%MOD - 1ll*FA[i]*FA[i]%MOD*FB[i]%MOD + MOD)%MOD;
        }
        res = IFFT(FA,tot,lgt)%smod;
        int inv = qpow(tot,MOD - 2);
        for(int &v : res){
            v = 1ll*v*inv%MOD;
        }
    }
    return res;
}
vector<int> dif(const vector<int> va){
    vector<int> res(va.size() - 1);
    for(int i = 1;i < va.size();i++){
        res[i - 1] = 1ll*res[i]*i%MOD;
    }
    return res;
}
const int N = 2e4+10;
int jc[N];
int jc_1[N];
int main(){
    init();
    int n,m,x;
    cin>>n>>m>>x;
    vector<int> egf(m + 1);
    vector<int> ex(m + 1);
    for(int i = 0;i<=m;i++){
        cin>>egf[i];
    }
    jc[0] = 1;
    for(int i = 1;i<=m;i++){
        jc[i] = 1ll*jc[i - 1]*i%MOD;
    }
    jc_1[m] = qpow(jc[m],MOD - 2);
    for(int i = m - 1;i >= 1;i--){
        jc_1[i] = 1ll*jc_1[i + 1] *(i + 1)%MOD;
    }
    jc_1[0] = 1;
    for(int i = 0;i<=m;i++){
        egf[i] = 1ll*egf[i]*jc_1[i]%MOD;
        ex[i] = jc_1[i];
    }
    vector<int> wogf = inv(ex,m + 1)*egf%(m + 1);
    int ans = 0;
    int r1 = 1,r2 = 1;
    for(int i = 0;i<=m;i++){
        ans = (ans + 1ll*wogf[i]*r1%MOD*r2%MOD)%MOD;
        r1 = 1ll*r1*(n - i)%MOD;
        r2 = 1ll*r2*x%MOD;
    }
    cout<<ans<<'\n';
}